package com.cskaoyan.javase.basic._2variable._3notice;

/**
 * 变量的使用---浮点数的精度问题
 * 浮点数之所以有精度问题,主要原因是有效位数的限制,除此之外还有二进制表示小数的问题
 * 把十进制小数转换成二进制:
 * 十进制正小数（0.开头）转换成二进制，先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * - 然后小数部分继续乘2
 * - 直到小数部分为0，或者已经达到了最大的位数
 * - 最终的结果（0.开头）正序排列
 *
 * 以0.1为案例:
 *      0.1 * 2 = 0.2 --- 0
 *      0.2 * 2 = 0.4 --- 0
 *      0.4 * 2 = 0.8 --- 0
 *      0.8 * 2 = 1.6 --- 1
 *      0.6 * 2 = 1.2 --- 1
 *      0.2 * 2 = 0.4 --- 0
 *      ....
 * 我们发现十进制小数0.1转换成二进制小数,是一个无限的循环小数
 * 用有限位数的浮点数表示无限的二进制小数是不可能的,数据肯定会丢失,数值就失真了,这就是浮点数的精度问题.
 *
 *
 * @since 17:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*float a = 1;
        float b = 0.9F;
        System.out.println(a - b);*/

        /*double a = 0.1;
        float b = 0.1F;
        System.out.println(a == b);*/

        float a = 0.1F;
        float b = 0.10000000000000000001F; //中间18个0
        System.out.println(a == b);

    }
}
